home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / misc / parsarg.c < prev   
C/C++ Source or Header  |  1998-03-03  |  3KB  |  129 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: /usr/CVS/descent/misc/parsarg.c,v $
  15.  * $Revision: 1.1.1.1 $
  16.  * $Author: nobody $
  17.  * $Date: 1998/03/03 15:12:42 $
  18.  *
  19.  * Source for parse_args() function.  See header file (parsarg.h) for info
  20.  *
  21.  * $Log: parsarg.c,v $
  22.  * Revision 1.1.1.1  1998/03/03 15:12:42  nobody
  23.  * reimport after crash from backup
  24.  *
  25.  * Revision 1.1.1.1  1998/02/13  20:21:17  hfrieden
  26.  * Initial Import
  27.  *
  28.  * Revision 1.1  1993/09/09  17:32:03  matt
  29.  * Initial revision
  30.  * 
  31.  *
  32.  */
  33.  
  34. #pragma off (unreferenced)
  35. static char rcsid[] = "$Id: parsarg.c,v 1.1.1.1 1998/03/03 15:12:42 nobody Exp $";
  36. #pragma on (unreferenced)
  37.  
  38. #include <stdio.h>
  39. #include <stdlib.h>
  40. #include <string.h>
  41.  
  42. #include "parsarg.h"
  43.  
  44. #define ARGBUF_SIZE 500
  45. #define MAX_ARGS 100
  46.  
  47. char arg_buf[ARGBUF_SIZE];
  48. char *ab_ptr=arg_buf;
  49.  
  50. void perror_exit(int n,char *s)
  51. {
  52.     perror(s);
  53.     exit(n);
  54. }
  55.  
  56. void verror(char *s,void *first_arg_ptr)
  57. {
  58.     fprintf(stderr,"Error: ");
  59.     vfprintf(stderr,s,first_arg_ptr);
  60.     fprintf(stderr,"\n");
  61. }
  62.  
  63. void error_exit(int ret_code,char *s,...)
  64. {
  65.     verror(s,((char *) &s)+sizeof(s));    /* addr of next parm on stack */
  66.     exit(ret_code);
  67. }
  68.  
  69. void parse_args(int argc,char **argv,void (*handler_func)(char *arg),int flags)
  70. {
  71.  
  72.     for (;argc--;argv++) {
  73.         if (**argv=='@') {            /* read args from file */
  74.             char *arg_ptrs[MAX_ARGS];
  75.             int arg_count;
  76.             FILE *argfile;
  77.             int len;
  78.             char *p=ab_ptr,c;
  79.  
  80.             if ((argfile=fopen(*argv+1,"rt"))==0) perror_exit(10,*argv+1);
  81.             if ((len=fread(ab_ptr,1,ARGBUF_SIZE-((int) (ab_ptr-arg_buf)),argfile))==ARGBUF_SIZE-(ab_ptr-arg_buf)) error_exit(20,"Argument buffer not big enough\n");
  82.             fclose(argfile);
  83.             ab_ptr[len++]=0;        /* write terminating null */
  84.  
  85.             /* remove comments */
  86.  
  87.             while ((p=strchr(ab_ptr,';'))!=NULL) {
  88.                 char *p2=strchr(p,'\n');
  89.  
  90.                 if (p2) {     /* found cr */
  91.                     strcpy(p,p2);    /* copy over comment */
  92.                     len = strlen(ab_ptr);
  93.                 }
  94.                 else {        /* no cr, end of string */
  95.                     *p=0;
  96.                     len = (int) (p-ab_ptr);
  97.                 }
  98.             }
  99.             ab_ptr[len]=0;        /* write terminating null */
  100.  
  101.             while (!ab_ptr[len-1]) len--;    /* back up over terminating nulls */
  102.             p=ab_ptr;
  103.  
  104.  
  105.             for (arg_count=0;p<ab_ptr+len;) {
  106.                 while (p<ab_ptr+len && ((c=*p)==' ' || c=='\t' || c=='\n')) p++;
  107.                 if (p<ab_ptr+len) {    /* found parm? */
  108.                     arg_ptrs[arg_count++]=p;
  109.                     if (arg_count>=MAX_ARGS) error_exit(10,"Too many args");
  110.                     while (p<ab_ptr+len && !((c=*p)==' ' || c=='\t' || c=='\n')) p++;
  111.                     *p++=0;
  112.                 }
  113.             }
  114.             ab_ptr+=len;
  115.             parse_args(arg_count,arg_ptrs,handler_func,flags);
  116.         }
  117.         else
  118.             if (flags&PA_EXPAND && (**argv != '-')) {
  119.                 handler_func(*argv);
  120.             }
  121.             else
  122.                 handler_func(*argv);
  123.  
  124.     }
  125.  
  126. }
  127.  
  128.  
  129.